package com.black.opencvStudy;

import org.junit.Test;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

/**
 * @description：
 * 图像的阈值
 * @author：8568
 */
public class Demo8 extends OpencvEV {

    @Test
    public void threshold() {
        // 船舰一个水平方向的渐变单通道图像
        Mat zeros = Mat.zeros(100, 255, CvType.CV_8UC1);
        for (int i = 0; i < zeros.cols(); i ++) {
            for (int j = 0; j < zeros.rows(); j++) {
                zeros.put(j, i , 255 - i);
            }
        }
        showImg(zeros, "渐变图像");

        // 阈值
        Mat result = new Mat();
        Imgproc.threshold(zeros, result,
                // 阈值
                125,
                // 最大值以及阈值类型 http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/threshold/threshold.html
                255, Imgproc.THRESH_BINARY_INV);
        showImg(result, "阈值处理图片");
    }

    /**
     * 自适应阈值
    */
    @Test
    public void test() {
        Mat shadow = Imgcodecs.imread("src/main/resources/img/shadow.jpg", Imgcodecs.IMREAD_COLOR);
        showImg(shadow, "原图");
        Mat gray = new Mat();
        Imgproc.cvtColor(shadow, gray, Imgproc.COLOR_BGR2GRAY);
        showImg(gray, "图片转为灰度图片");
        Mat result = new Mat();
        Imgproc.adaptiveThreshold(
                // 原图、只能单通道
                gray,
                // 输出图像
                result,
                // 最大值
                200,
                // 自适应方法
                Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C,
                // 阈值类型
                Imgproc.THRESH_BINARY,
                // 块大小
                5,
                // 减去的常熟
                10);
        showImg(result, "自适应阈值");
    }

    /**
     * Otsu二值化
     * TODO 因为直方图等概念后面才会出翔、所以后面补上
    */

}
